/**
 * SPDX-FileCopyrightText: 2023-2025 Sangfor Technologies Inc.
 * SPDX-License-Identifier: Mulan PSL v2
 */
/**
 * Created by czh on 2019/4/22.
 */

import Vue from 'vue';
import { trim } from 'src/util/format';

/**
 * 初始化multLine指令
 * 该指令必须直接作用于直接包裹文本的元素
 */
function init () {

    function multiLineOverflowHide (el, binding, vnode) {
        const APOSTROPHE_LEN = 3;
        let rowCount = parseInt(binding.value, 10) || APOSTROPHE_LEN;
        el.style.overflow = 'auto';
        el.style.wordBreak = 'break-word';
        let s = trim(vnode.children[0].text || '');
        el.title = s;
        el.innerText = '.';
        el.style.height = '';

        // let n = el.offsetHeight * rowCount;
        let n = el.getBoundingClientRect().height * rowCount;
        for (let i = 0; i <= s.length; i++) {
            el.innerHTML = s.substr(0, i);

            // if (n < el.scrollHeight) {
            if (n < el.getBoundingClientRect().height) {
                el.style.overflow = 'hidden';
                el.innerHTML = s.substr(0, i - APOSTROPHE_LEN) + '...';
                el.style.height = `${n}px`;
                break;
            }
        }
    }

    Vue.directive('multLineHide', {

        // 只调用一次，指令第一次绑定到元素时调用，用这个钩子函数可以定义一个在绑定时执行一次的初始化动作
        bind () {
        },

        // 被绑定元素插入父节点时调用（父节点存在即可调用，不必存在于 document 中）。
        inserted: multiLineOverflowHide,

        // 被绑定元素所在的模板更新时调用，而不论绑定值是否变化。通过比较更新前后的绑定值，可以忽略不必要的模板更新（详细的钩子函数参数见下）。
        update: multiLineOverflowHide,

        componentUpdated () {

            // 被绑定元素所在模板完成一次更新周期时调用。
        },

        unbind () {

            // 只调用一次， 指令与元素解绑时调用。
        }
    });
}

export default {
    init
};
